package com.zslin.core.tasker;

import com.zslin.core.common.NormalTools;
import com.zslin.core.dao.IBaseTaskDao;
import com.zslin.core.model.BaseTask;
import com.zslin.core.validate.ValidationDto;
import com.zslin.core.validate.ValidationTools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.UUID;

/**
 * 处理任务工具类
 */
@Component("processTaskTools")
@Slf4j
public class ProcessTaskTools {

    @Autowired
    private IBaseTaskDao baseTaskDao;

    @Autowired
    private BeanCheckTools beanCheckTools;

    @Autowired
    private CronTaskRegistrar cronTaskRegistrar;

    /**
     * 创建循环任务
     * @param taskDesc 描述
     * @param beanName beanName
     * @param methodName methodName
     * @param params 参数
     * @param uuid 任务ID
     * @param startTime 启动时间
     * @param period 下一次间隔多久执行
     * @param autoStart 是否自动启动
     * @return
     */
    public BaseTask buildCircleTask(String taskDesc, String beanName, String methodName,
                                  String params, String uuid, String startTime, long period, boolean autoStart) {
        BaseTask task = new BaseTask();
        task.setTaskDesc(taskDesc);
        task.setStatus("1");
        task.setBeanName(beanName);
        task.setMethodName(methodName);
        task.setType(BaseTask.TYPE_LOOP); //1-循环任务
        task.setParams(params);
        task.setTaskUuid(uuid);
        task.setStartTime(startTime);
        task.setCreateTime(NormalTools.curDatetime());
        task.setCreateLong(System.currentTimeMillis());
        task.setCreateDay(NormalTools.curDate());

        task.setIsWait("1");
        task.setPeriod(period);
        if(autoStart) { //如果需要自动运行，则直接启动
            addTask(task);
        }
        return task;
    }

    public boolean addTask(BaseTask task) {
        ValidationDto vd = ValidationTools.buildValidate(task);
        if(vd.isHasError()) { //如果有验证异常
//            return JsonResult.getInstance().failFlag(BusinessException.Code.VALIDATE_ERR, BusinessException.Message.VALIDATE_ERR, vd.getErrors());
            return false;
        }
        if(beanCheckTools.checkMethod(task.getBeanName(), task.getMethodName(), task.getParams())) {
            log.info("{}.{} 任务可以使用", task.getBeanName(), task.getMethodName());
        }

        if(task.getTaskUuid()==null || "".equals(task.getTaskUuid())) {
            task.setTaskUuid(UUID.randomUUID().toString());
        }
        task.setCreateDay(NormalTools.curDate());
        task.setCreateTime(NormalTools.curDatetime());
        task.setCreateLong(System.currentTimeMillis());
        baseTaskDao.save(task);

        /*System.out.println("===============ProcessTaskTools===>");
        System.out.println(task);*/

        if("1".equals(task.getStatus())) { //如果添加的时候status=1，则自动启动
            cronTaskRegistrar.addTask(task); //添加到任务中
        }
        return true;
    }

    /**
     *
     * @param task 执行的具体任务对象
     * @param flag 执行结果标识，1-成功；0-异常
     */
    public void handler(BaseTask task, String flag) {
        log.info("执行结果：{}, 对象：{}", flag, task);
        if(BaseTask.TYPE_SINGLE.equals(task.getType())) { //如果是单次运行，则需要修改状态
            baseTaskDao.updateStatus("0", task.getTaskUuid());
        }
        Integer sucCount = "1".equals(flag)?1:0;
        Integer errCount = "1".equals(flag)?0:1;
        baseTaskDao.updateCount(sucCount, errCount, task.getId());
    }

    public boolean deleteTask(String taskId) {
        TaskDto curTask = cronTaskRegistrar.findByUuid(taskId);
        if(curTask!=null) {
//            return JsonResult.getInstance().failFlag("【"+task.getTaskDesc()+"】正在运行，请先停止后再删除！");
            return false;
        } else {
            baseTaskDao.deleteByUUid(taskId);
            return true;
        }
    }

    /** 强制删除任务，如果正在运行则先停止 */
    public boolean deleteTaskForce(String taskId) {
//        BaseTask task = baseTaskDao.findByTaskUuid(taskId);
//        String taskUuid = task.getTaskUuid();
        try {
//            System.out.println("==============================="+taskId);
            TaskDto curTask = cronTaskRegistrar.findByUuid(taskId);
            if(curTask!=null) {
                cronTaskRegistrar.removeByUuid(taskId);
            }
            baseTaskDao.deleteByUUid(taskId);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    public boolean startTask(String taskId) {
        try {
            BaseTask task = baseTaskDao.findByTaskUuid(taskId);
            cronTaskRegistrar.addTask(task); //添加到任务中
            baseTaskDao.updateStatus("1", taskId); //设置状态为启动
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
